// 汉中库得网络科技版权所有
#pragma once

#include "CoreMinimal.h"
#include "SQLiteDatabaseConnection.h"
#include "Db.generated.h"

DECLARE_LOG_CATEGORY_EXTERN(LogSQLiteDbKit, Log, All);

class URecord;
/**
 * 数据库操作工具类
 */
UCLASS()
class SQLITEDBKIT_API UDb : public UObject
{
	GENERATED_BODY()
public:
	/**
	 * 添加一条数据到数据库 
	 * @param TableName 数据表名称
	 * @param Record 数据记录
	 */
	UFUNCTION(BlueprintCallable, Category="SQLiteDbKit", DisplayName="DBSave")
	static bool Save(const FString TableName, URecord* Record);

	/**
	 * 按ID获取一条数据，默认ID列的名称为"id"
	 * @param TableName 
	 * @param Id 
	 */
	static URecord* FindById(const FString& TableName, const FString& Id);
	
	/**
	 * 按ID获取一条数据
	 * @param TableName 数据表名称
	 * @param IdColumnName ID列名称
	 * @param Id 要检索的ID
	 */
	UFUNCTION(BlueprintCallable, Category="SQLiteDbKit", DisplayName="DBFindById")
	static URecord* FindById(const FString& TableName, const FString& IdColumnName, const FString& Id);

	/**
	 * 更新一条记录
	 * @param TableName 
	 * @param Record 
	 */
	UFUNCTION(BlueprintCallable, Category="SQLiteDbKit", DisplayName="DBUpdate")
	static bool Update(const FString TableName, const FString& IdColumnName, URecord* Record);

	/**
	 * 查询语句，要求查询结果只有一个值，并且是可以转换成Int类型的
	 * @param Sql 
	 */
	UFUNCTION(BlueprintCallable, Category="SQLiteDbKit", DisplayName="DBQueryInt")
	static int32 QueryInt(FString Sql);

	/**
	 * 配置SQLite数据库目录及文件名
	 * @param DBFile 数据库文件，该文件存放在Content/文件夹下，如：Config(TEXT("SQLiteDBs/DBName.db")), 并且需要在打包配置中，将该目录添加到“要复制的额外非资产目录”中
	 */
	static void Config(FString DBFile);

private:
	inline static FString DBFile = "";
	inline static FSQLiteDatabaseConnection DBConnection = FSQLiteDatabaseConnection();
	inline static bool bIsOpened = false;

	/* 获得数据库连接 */
	static void Open();
	/* 关闭数据库连接 */
	static void Close();
	/* 执行SQL语句 */
	static bool ExecSql(const FString& Sql);
	/* 执行SQL语句，并返回结果 */
	static bool ExecSql(const FString& Sql, FDataBaseRecordSet*& RecordSet);
};
